package com.takeoff.iot.modbus.netty.handle;

import com.takeoff.iot.modbus.common.message.MiiMessage;
import io.netty.handler.codec.LengthFieldBasedFrameDecoder;

import java.nio.ByteOrder;

/**
 * 类功能说明：自定义解码器长度，解决TCP粘包黏包问题<br/>
 * 公司名称：TF（腾飞）开源 <br/>
 * 作者：luorongxi <br/>
 */
public class MiiBasedFrameDecoder extends LengthFieldBasedFrameDecoder {

    /**
     * LengthFieldBasedFrameDecoder是⾃定义长度解码器，所以构造函数中6个参数，基本都围绕那个定义长度域，进⾏的描述。
     * 1. ByteOrder - 数据存储采⽤⼤端模式或⼩端模式
     * 2. maxFrameLength - 发送的数据帧最⼤长度
     * 3. lengthFieldOffset - 定义长度域位于发送的字节数组中的下标。换句话说：发送的字节数组中下标为${lengthFieldOffset}的地⽅是长度域的开始地⽅
     * 4. lengthFieldLength - ⽤于描述定义的长度域的长度。换句话说：发送字节数组bytes时,
     * 字节数组bytes[lengthFieldOffset,lengthFieldOffset+lengthFieldLength]域对应于的定义长度域部分
     * 5. lengthAdjustment - 满⾜公式: 发送的字节数组bytes.length - lengthFieldLength = bytes[lengthFieldOffset,
     * lengthFieldOffset+lengthFieldLength] + lengthFieldOffset + lengthAdjustment
     * 6. initialBytesToStrip - 接收到的发送数据包，去除前initialBytesToStrip位
     * 7. failFast - true: 读取到长度域超过maxFrameLength，就抛出⼀个 TooLongFrameException。
     * false: 只有真正读取完长度域的值表⽰的字节之后，才会抛出TooLongFrameException，默认情况下设置为true，建议不要修改，否则可能会造成内存溢出
     */
    public MiiBasedFrameDecoder() {
        super(ByteOrder.LITTLE_ENDIAN, Integer.MAX_VALUE, MiiMessage.DATA_INDEX, MiiMessage.DATA_SIZE, 3, 0, true);
    }

}
